#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <cstring>
#include <cerrno>
#include <thread>

using namespace std;

//如果多线程访问同一个全局变量，并对它进行数据计算，多线程会互相影响
int tickets = 10000; // 在并发访问的时候，导致了数据不一致的问题！

void* getTickets(void* args)
{
    (void)args;
    while (true)
    {
        if (tickets > 0)
        {
            usleep(1000);
            printf("%p: %d\n", pthread_self(), tickets);
            tickets--;
        }
        else {
            break;
        }
    }
    return nullptr;
}

int main()
{
    pthread_t t1, t2, t3;
    // 多线程抢票的逻辑
    pthread_create(&t1, nullptr, getTickets, nullptr);
    pthread_create(&t2, nullptr, getTickets, nullptr);
    pthread_create(&t3, nullptr, getTickets, nullptr);

    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);
}





// void fun()
// {
//     while(true)
//     {
//         cout << "hello new thread" << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     thread t(fun);
//     thread t1(fun);
//     thread t2(fun);
//     thread t3(fun);
//     thread t4(fun);

//     while(true)
//     {
//         cout << "hello main thread" << endl;
//         sleep(1);
//     }

//     t.join();
// }







// //_ _thread : 修饰全局变量，让每一个线程各自拥有一个全局的变量 -- 线程的局部存储
// __thread int g_val = 0;


// //1.线程谁先运行与调度器有关
// //2.线程一旦异常，可能导致整个进程整体退出
// void* threadRoutine(void* args)
// {
//     //pthread_detach(pthread_self());

//     while (true)
//     {
//         cout << (char*)args << " : " << g_val << " &: " << &g_val << endl;
//         g_val++;
//         sleep(1);
//         break;
//     }
//     pthread_exit((void*)11);

//     // int i = 0;
//     // while (true)
//     // {
//     //     cout << "新线程: " << (char*)args << " is running ...新线程tid: " << pthread_self() << endl;
//     //     sleep(1);
//     //     // if (i++ == 3)
//     //     // {
//     //     //     break;
//     //     // }

//     //     // int a = 100;
//     //     // a /= 0;
//     // }
//     // //pthread_exit((void*)13);
//     // //exit(10);//不能用exit，exit是终止进程的
//     // cout << "new thread quit" << endl;

//     //return (void*)10;//一般是返回给main thread，通过pthread_join获取
// }

// int main()
// {
//     //目前用的不是Linux自带的创建线程的接口，用的是pthread库中的接口！
//     pthread_t tid;//本质是一个地址
//     pthread_create(&tid, nullptr, threadRoutine, (void*)"thread 1");

//     while (true)
//     {
//         cout << "main thread" << " : " << g_val << " &: " << &g_val << endl;
//         sleep(1);
//         break;
//     }
//     int n = pthread_join(tid, nullptr);
//     cout << "n :" << n << "errstring: " << strerror(n) << endl;

//     // printf("%lu, %p", tid, tid);
//     // int count = 0;
//     // while (true)
//     // {
//     //     cout << "主线程: running... 主线程tid: " << pthread_self() << endl;
//     //     sleep(1);
//     //     count++;
//     //     if (count == 5)
//     //     {
//     //         break;
//     //     }
//     // }

//     // //1. 线程被取消，join的时候，退出码是-1 #define PTHREAD_CANCELED ((void *) -1)
//     // pthread_cancel(tid);
//     // cout << "thread cancel: " << tid << endl;

//     // int* ret = nullptr;
//     // pthread_join(tid, (void**)&ret);
//     // //pthread_join(tid, nullptr);//默认会阻塞等待新线程退出


//     // sleep(5);
//     // cout << "main thread wait done ... main thread quit, new thread quit: " << (long long)ret << endl;

//     //3.线程在创建并执行的时候，线程也是需要进行等待的，如果主线程不等待，就会引起类似于僵尸进程的问题，导致内存泄漏
//     // while (true)
//     // {
//     //     cout << "主线程: " << " is running ..." << endl;
//     //     sleep(1);
//     // }

//     return 0;
// }